package sim_moteur.factory;

import java.awt.font.NumericShaper;

import sim_moteur.Coordonnee;
import sim_moteur.Terrain;
import sim_moteur.element.Chose;
import util.SimProperties;

public class AbstractFactory {

	protected SimProperties properties = SimProperties.getInstance();

	// Nouveau préfixe pour bien rentrer les noms avec la simulation
	public final static String SIM_PREFIX_NAME = "Sim_";
	public final static String X_SUFFIX_NAME = ".initial.position.x";
	public final static String Y_SUFFIX_NAME = ".initial.position.y";

	public final static String VEGETAUX_PROPERTY_NAME = "simulation.vegetaux.nombre";
	public final static String ANIMAUX_PROPERTY_NAME = "simulation.animal.nombre";
	public final static String CHOSE_PROPERTY_NAME = "simulation.chose.nombre";
	public final static String NOMBRE_SIM_PROPERTY_NAME = "simulation.nombre";

	protected int nombre = 0;

	protected Integer[] nombreAnimauxMax;
	protected Integer[] nombreVegetauxMax;
	protected Integer[] nombreChoseMax;
	private int nombreSimulation;

	AbstractFactory() {
		nombreSimulation = properties.getIntProperty(NOMBRE_SIM_PROPERTY_NAME);

		nombreAnimauxMax = new Integer[nombreSimulation];
		nombreVegetauxMax = new Integer[nombreSimulation];
		nombreChoseMax = new Integer[nombreSimulation];

		// tous les propriétés sont maintenant lié avec son simulateur
		for (int i = 0; i < nombreSimulation; i++) {
			nombreAnimauxMax[i] = properties.getIntProperty(SIM_PREFIX_NAME + i
					+ "." + ANIMAUX_PROPERTY_NAME);
			nombreVegetauxMax[i] = properties.getIntProperty(SIM_PREFIX_NAME
					+ i + "." + ANIMAUX_PROPERTY_NAME);
			nombreChoseMax[i] = properties.getIntProperty(SIM_PREFIX_NAME + i
					+ "." + CHOSE_PROPERTY_NAME);
		}

	}

	/**
	 * Place l'élément au bon endroit en respectant ce qui est indiqué dans le
	 * fichier de propriétés.
	 * 
	 * @param chose
	 *            la chose à placée
	 */
	protected <T extends Chose> void place(T chose) {
		String nom = chose.getName();
		int x = properties.getIntProperty(nom + ".initial.position.x");
		int y = properties.getIntProperty(nom + ".initial.position.y");
		Coordonnee coordonneeSouhaitee = new Coordonnee(x, y);
		Terrain terrain = Terrain.getInstance();
		if (terrain.estPlacable(chose, coordonneeSouhaitee)) {
			terrain.place(chose, coordonneeSouhaitee);
		} else {
			chose.setCoordonnees(coordonneeSouhaitee);
			Coordonnee nouvelleCoordonnee = terrain.trouveUnePlacePresDe(chose);
			if (nouvelleCoordonnee != null) {
				chose.setCoordonnees(nouvelleCoordonnee);
			} else {
				terrain.trouveUnePlaceAletoire(chose);
			}
		}
	}

}
